﻿using System;

namespace InDepth2Demo.Chapter4
{
    // 4.3.3 可空转换和操作符
    internal class NullableConversionsAndOperators
    {
        // 可空类型的实例能与 null 进行比较

        // int? 到 long? 的隐式转换
        public static void Call()
        {
            int? x = 10;
            long? y = x;
            Console.WriteLine(y);
        }

        // 我们已知的，三种，涉及可空类型的转换
        public static void Call2()
        {
            int? x = null;              // null 到 T? 的隐式转换

            int y1 = 2;
            int? y2 = y1;               // T 到 T? 的隐式转换

            int? z1 = 5;
            int z2 = (int)z1;           // T? 到 T 的显示转换
        }

        // 假如允许从非可空值类型（S）转换成另一个非可空值类型（T）
        public static void Call3()
        {
            int? x1 = 1;
            int? x2 = x1;               // S? 到 T? 隐式 （同一类型）

            long? x3 = x1;              // S? 到 T? 隐式 （不同类型，低字节数转向高字节数）

            byte? x4 = (byte?)x1;       // S? 到 T? 显式 （不同类型，高字节数转向低字节数）
            // S? 到 T?（可能是显式或隐式的，具体取决于原始转换）；
        }


        // int 和 null 能做比较吗
        public static void Call4()
        {
            int i = 5;
            if (i == null)            // 左侧的 i 和 右侧的 null，编译器知道两者都存在到 int? 的一个隐式转换
            {                         // 由于"int"类型的值永不等于"int?"类型的"null"，该表达式的结果始终为"false"
                Console.WriteLine("Nerver going to happen");
            }
        }


        // 4.3.5 对可空类型使用as操作符
        static void PrintValueAsInt32(object o)
        {
            int? nullable = o as int?;
            Console.WriteLine(nullable.HasValue ? nullable.Value.ToString() : "null");
        }

        public static void Call5()
        {
            PrintValueAsInt32(5);               // 5
            PrintValueAsInt32("some string");   // null
        }

        static void AsTest()
        {
            int a = 1;
            long? b = a;
            Console.WriteLine(b);
        }
    }
}
